package day04;

import lombok.*;

/*
@Author: 王少杰
@Date: 2025/1/3
@Time: 8:58
@FileName: Demo01.java
@描述:
面向对象
    封装:属性设置为私有的，提供公共的get、set方法供外部使用。
        把属性和对属性的操作，封装在类的内部，隐藏一些实现细节。外部通过暴露的方法访问属性。
        python中:__属性名 私有属性
        封装通过访问控制符来实现
        private:私有的，只能在类内部访问。
        default:默认的，不加控制符时表示是默认的。包访问权限，在当前包中访问。day03是一个包
        protected:受保护的，同一个包中其他类可以访问，不同包中它的子类可以访问。
        public:公共的，所有地方都可以访问。

    继承:extends 关键字实现
        只支持单继承
        子类可以继承父类的属性和方法
        构造方法不会被继承，子类可以通过super()方法调用父类的构造方法。
        父类中没有无参构造方法，子类必须定义构造方法，调用父类构造方法，设置父类属性的值。
        子类可以有自己的属性和方法
        子类可以重写父类的同名和方法
        所有类都是从Object继承的。

    多态:

    抽象:将多个有相同属性和行为的对象抽象成一个类型。创建类。

OverLoad 重载 OverRide 重写
    重载:类中有多个同名的方法，参数类型、参数个数不同。println
    重写:子类重写父类同名的方法。方法名、参数列表相同。
*/
public class Demo01 {
    public static void main(String[] args) {
        Pet pet = new Pet();
        pet.setName("小明");
        pet.setAge(18);
        pet.setHealth(60);
        System.out.println(pet);

        Fish fish = new Fish();
        fish.setName("小黄");
        fish.setAge(1);
        fish.setHealth(80);
        System.out.println(fish);

        Dog dog = new Dog();
        dog.setName("大黄");
        dog.setAge(8);
        dog.setHealth(90);
        dog.setPinzhong("中华田园犬");
        System.out.println(dog);
    }
}

@EqualsAndHashCode(callSuper = true)
@Data
class Cat extends Pet{

    public Cat(String name, int age, int health) {
        super(name, age, health);
    }
}
@EqualsAndHashCode(callSuper = true)
@Data
class Fish extends Pet{
    @Override
    public String toString() {
        return "Fish{} " + super.toString();
    }
}

@Getter
@Setter
class Dog extends Pet{
    private String pinzhong;
    @Override
    public String toString() {
        return "Dog{" +
                "pinzhong='" + pinzhong + '\'' +
                "} " + super.toString();//super.toString() 调用父类的方法
    }
}
@Data
class Pet{
    private String name; //名字
    private int age; //年龄
    private int health; //健康度


    public Pet() {
    }

    public Pet(String name, int age, int health) {
        this.name = name;
        this.age = age;
        this.health = health;
    }
}

